/** Obtiene una instancia nueva del objeto XMLHttpRequest
*/
function obtenerXHR()
{
	var req=false;
	if (window.XMLHttpRequest)
	{
		req=new XMLHttpRequest();
	}
	else
	{
		if (ActiveXObject)
		{
			var vectorVersiones = ["MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp"];
			for (var i=0; i<vectorVersiones.length; i++)
			{
				try
				{
					req = new ActiveXObject(vectorVersiones[i]);
					return req;
				}
				catch(e)
				{}
			}
		}
	}
	return req;
}

/** Obtiene una instancia nueva del objeto XMLHttpRequest
/* @returns void
/* @param {string} capa_respuesta Capa utilizada para dar respuesta al contenido HTML solicitado.
/* @param {string} capa_aviso Capa utilizada para informar el estado de la carga del contenido solicitado.
/* @param {string} url Dirección del contenido a solicitar (en caso de utilizar GET el paso de parámetros debe ir anexado al URL).
/* @param {string} metodo Método de comunicación a utilizar (GET o POST).
/* @param {string} parametros Parámetros a utilizar con el método de comunicación POST.
/* @param {boolean} asincronico Asíncrono (true) o sincronico (false).
/* @param {boolean} (false)escribe en html el resultado o en su defecto lo devuelve (true) a la función donde se invocó.
/* @param {string} Mensaje a publicar en la capa de aviso.
*/
function cargar (capa_respuesta, capa_aviso, url, metodo, parametros, asincronico, mensaje)
{
	var peticion=obtenerXHR();
	peticion.open(metodo,url,asincronico);
	peticion.onreadystatechange=function procesarPeticion(){
			if (peticion.readyState<4)
			{
				document.getElementById(capa_aviso).style.visibility="visible";
				if (mensaje!="")
				{
					document.getElementById(capa_aviso).innerHTML=mensaje;
				}
				else
				{
					document.getElementById(capa_aviso).innerHTML="cargando...";
				}
			}
			else if (peticion.readyState==4)
			{
				if (peticion.status==200)
				{
					var scs=peticion.responseText.extractScript(); //para scripts
					scs.evalScript(); //para scripts
					document.getElementById(capa_respuesta).innerHTML=peticion.responseText;
					document.getElementById(capa_aviso).style.visibility="hidden";
					
				}
				else
				{
					document.getElementById(capa_respuesta).innerHTML="Este contenido no puede accederse en este momento. Por favor intente más tarde.";
					document.getElementById(capa_aviso).style.visibility="hidden";
				}
			}
		};
	if (metodo=="POST")
	{
		peticion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
	}
	peticion.send(parametros);
}

/** Metodo simple de respuestas en ajax
/* @returns Retorna la peticion de la pagina solicitada
/* @param {string} url Dirección del contenido a solicitar (en caso de utilizar GET el paso de parámetros debe ir anexado al URL).
/* @param {string} metodo Método de comunicación a utilizar (GET o POST).
/* @param {string} parametros Parámetros a utilizar con el método de comunicación POST.
/* @param {boolean} asincronico Asíncrono (true) o sincronico (false).
*/
function cargarSimple (url, metodo, parametros,asincronico)
{
	var peticion=obtenerXHR();
	peticion.open(metodo,url,asincronico);
	if (metodo=="POST")
	{
		peticion.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
		peticion.setRequestHeader("Content-length", parametros.length);
		peticion.setRequestHeader("Connection", "close");
	}
	peticion.send(parametros);
	

	if ((peticion.readyState==4)&&(peticion.status==200))
{	
		return (peticion.responseText);
}
	else
		return (-1);
}


var tagScript = '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)';
        /**
        * Eval script fragment
        * @return String
        */
        String.prototype.evalScript = function()
        {
                return (this.match(new RegExp(tagScript, 'img')) || []).evalScript();
        };
        /**
        * strip script fragment
        * @return String
        */
        String.prototype.stripScript = function()
        {
                return this.replace(new RegExp(tagScript, 'img'), '');
        };
        /**
        * extract script fragment
        * @return String
        */
        String.prototype.extractScript = function()
        {
                var matchAll = new RegExp(tagScript, 'img');
                return (this.match(matchAll) || []);
        };
        /**
        * Eval scripts
        * @return String
        */
        Array.prototype.evalScript = function(extracted)
        {
                var s=this.map(function(sr){
                         var sc=(sr.match(new RegExp(tagScript, 'im')) || ['', ''])[1];
                         if(window.execScript){
                              window.execScript(sc);
                         }
                        else
                       {
                           window.setTimeout(sc,0);
                        }
                });
                return true;
        };
        /**
        * Map array elements
        * @param {Function} fun
        * @return Function
        */
        Array.prototype.map = function(fun)
        {
                if(typeof fun!=="function"){return false;}
                var i = 0, l = this.length;
                for(i=0;i<l;i++)
                {
                        fun(this[i]);
                }
                return true;
        }; 
		
